home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
mg2a_src.zip
/
SYS
/
AMIGA
/
ICONIFY
/
ICONIFY.C
next >
Wrap
C/C++ Source or Header
|
1988-08-23
|
5KB
|
212 lines
/* :ts=8 bk=0
*
* iconify.c: You asked for it, you got it.
*
* Copyright 1987 by Leo L. Schwab.
* Permission is hereby granted for use in any and all programs, both
* Public Domain and commercial in nature, provided this Copyright notice
* is left intact. Purveyors of programs, at their option, may wish observe
* the following conditions (in the spirit of hackerdom):
* 1: You send me a free, registered copy of the program that uses the
* iconify feature,
* 2: If you're feeling really nice, a mention in the program's
* documentation of my name would be neat.
*
* 8712.10 (415) 456-3960
*/
#include <exec/types.h>
#include <devices/timer.h>
#include <intuition/intuition.h>
#include "iconify.h"
/*
* It is recommended that the tick rate not be made too rapid to avoid
* bogging down the system.
*/
#define TICKS_PER_SECOND 10
/*
* Some programmers may not wish to have the added functionality of the
* ICON_FUNCTION feature. If you're such a programmer, you may comment out
* the following #define, which will eliminate the code to handle function
* calls, and make iconify() even smaller.
*/
#define USE_FUNCTIONS
/*
* Jim Mackraz suggested making icons easily identifiable by outside
* programs, so this constant gets stuffed into the UserData field.
*/
#define ICON 0x49434f4eL /* 'ICON' */
extern void *OpenWindow(), *GetMsg(), *CreatePort(), *CreateExtIO(),
*CheckIO();
extern long OpenDevice(), DoubleClick();
static struct Gadget gadget = {
NULL,
0, 0, 0, 0,
NULL, /* Set later */
GADGIMMEDIATE,
WDRAGGING, /* Observe the Magic! */
NULL, /* Set later */
NULL, NULL, NULL, NULL,
0, 0
};
static struct NewWindow windef = {
0, 0, 0, 0, /* Set later */
-1, -1,
GADGETDOWN,
BORDERLESS | SMART_REFRESH | NOCAREREFRESH,
&gadget,
NULL, NULL, NULL, NULL, /* Lotsa these */
0, 0, 0, 0,
WBENCHSCREEN
};
static struct Window *win;
#ifdef USE_FUNCTIONS
static struct timerequest *tr;
static struct MsgPort *reply;
#endif
iconify (left, top, width, height, screen, ptr, type)
UWORD *left, *top, width, height;
struct Screen *screen;
APTR ptr;
int type;
{
register struct IntuiMessage *msg;
long secs = 0, mics = 0,
cs, cm,
class,
sigmask;
windef.LeftEdge = *left;
windef.TopEdge = *top;
windef.Width = width;
windef.Height = height;
windef.Type = (windef.Screen = screen) ? CUSTOMSCREEN : WBENCHSCREEN;
gadget.Flags = GADGHCOMP | GRELWIDTH | GRELHEIGHT;
switch (type & 3) {
case ICON_IMAGE:
gadget.Flags |= GADGIMAGE;
case ICON_BORDER:
gadget.GadgetRender = ptr;
break;
case ICON_FUNCTION:
#ifdef USE_FUNCTIONS
gadget.GadgetRender = NULL;
#else
return (0);
#endif
break;
default:
return (0);
}
if (!openstuff ())
return (0);
sigmask = 1L << win -> UserPort -> mp_SigBit;
#ifdef USE_FUNCTIONS
if (type == ICON_FUNCTION) {
sigmask |= 1L << reply -> mp_SigBit;
tr -> tr_node.io_Command= TR_ADDREQUEST;
tr -> tr_time.tv_secs = 0;
tr -> tr_time.tv_micro = (1000000L / TICKS_PER_SECOND);
SendIO (tr);
/*
* Make initialization call to user's function.
* Isn't typecasting wonderful? :-|
*/
(* ((void (*)()) ptr)) (win, (WORD) 1);
}
#endif
while (1) {
Wait (sigmask);
#ifdef USE_FUNCTIONS
if (GetMsg (reply)) {
/*
* Call user's function to do something to the icon.
*/
(* ((void (*)()) ptr)) (win, (WORD) 0);
tr -> tr_time.tv_secs = 0;
tr -> tr_time.tv_micro =
(1000000L / TICKS_PER_SECOND);
SendIO (tr);
}
#endif
if (msg = GetMsg (win -> UserPort)) {
class = msg -> Class;
cs = msg -> Seconds;
cm = msg -> Micros;
ReplyMsg (msg);
if (class == GADGETDOWN) {
if (DoubleClick (secs, mics, cs, cm))
break;
secs = cs; mics = cm;
}
}
}
#ifdef USE_FUNCTIONS
if (type == ICON_FUNCTION) {
AbortIO (tr);
WaitIO (tr);
}
#endif
*left = win -> LeftEdge;
*top = win -> TopEdge;
closestuff ();
return (1);
}
static
openstuff ()
{
if (!(win = OpenWindow (&windef)))
return (0);
win -> UserData = (BYTE *) ICON;
#ifdef USE_FUNCTIONS
if (!(reply = CreatePort (NULL, NULL)) ||
!(tr = CreateExtIO (reply, (long) sizeof (*tr))) ||
OpenDevice (TIMERNAME, UNIT_VBLANK, tr, 0L)) {
closestuff ();
return (0);
}
#endif
return (1);
}
static
closestuff ()
{
#ifdef USE_FUNCTIONS
if (tr) {
if (tr -> tr_node.io_Device)
CloseDevice (tr);
DeleteExtIO (tr, (long) sizeof (*tr));
}
if (reply) DeletePort (reply);
#endif
if (win) CloseWindow (win);
}